// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.main;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;

import com.eva.android.ToolKits;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.android.x.XToolKits;
import com.eva.framework.dto.LoginInfo2;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.eva.android.widget.BaseActivity;
import com.x52im.rbchat.logic.main.loginimpl.LoginHelper;
import com.x52im.rbchat.logic.main.loginimpl.LoginInfoToSave;
import com.x52im.rbchat.logic.more.HelpActivity;
import com.x52im.rbchat.permission2.PermissionManager;
import com.x52im.rbchat.utils.IntentFactory;
import com.x52im.rbchat.utils.PreferencesToolkits;

import java.util.List;
import java.util.Observer;

/**
 * 应用程序启动类：显示欢迎界面并跳转到主界面.
 * 
 * @author liux (http://my.oschina.net/liux)
 * @version 1.0
 */
public class SplashActivity extends BaseActivity {

	public static String SHAREDPREFERENCES_NAME = "first_pref";

	@Override
	public void onCreate(Bundle savedInstanceState) {

		// FIX: 以下代码是为了解决Android自level 1以来的[安装完成点击“Open”后导致的应用被重复启动]的Bug
		// @see https://code.google.com/p/android/issues/detail?id=52247
		// @see https://code.google.com/p/android/issues/detail?id=2373
		// @see https://code.google.com/p/android/issues/detail?id=26658
		// @see https://github.com/cleverua/android_startup_activity
		// @see http://stackoverflow.com/questions/4341600/how-to-prevent-multiple-instances-of-an-activity-when-it-is-launched-with-differ/
		// @see http://stackoverflow.com/questions/12111943/duplicate-activities-on-the-back-stack-after-initial-installation-of-apk
		// 加了以下代码还得确保Manifast里加上权限申请：“android.permission.GET_TASKS”
		if (!isTaskRoot()) {// FIX START
		    final Intent intent = getIntent();
		    final String intentAction = intent.getAction();
		    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
		        finish();
		    }
		}// FIX END

		//----------------------------- APP 异常自救代码 START
		// 详见 {@link MyApplication#appHearthCheckFlag} 字段的详细说明。
		MyApplication.appHearthCheckFlag = 1;
		//----------------------------- APP 异常自救代码 END

		// 全面屏沉浸式效果（系统顶部状态栏将变的透明，界面从状态栏下方透过）
		XToolKits.setStatusBarTranslucent(this, true);
		// 全面屏沉浸式效果（系统底部导航栏将变的透明，界面从导航栏下方透过）
		XToolKits.setNavigationBarTranslucent(this, true);

		super.onCreate(savedInstanceState);

		final View view = View.inflate(this, R.layout.main_splash_activity_v9_light, null);
		setContentView(view);

        // 渐变展示启动屏
		AlphaAnimation aa = new AlphaAnimation(0.2f, 1.0f);//0.3f, 1.0f
		aa.setDuration(2000);
		view.startAnimation(aa);
		aa.setAnimationListener(new AnimationListener() {
			@Override
			public void onAnimationEnd(Animation arg0) {
				// 动态权限申请：就像微信一样，app闪屏启动完成后，就申请必要的权限
				//（用于targetSDKVersion>=23，即Android6.0及以上系统时）
				PermissionManager.requestPermission_STORAGE_$_POST_NOTIFICATIONS(SplashActivity.this
						// 权限获取成功或已经取得此权限时（走正常的代码逻辑）
						, (o, permissionNamesObj) -> redirectTo()
						// 用户拒绝或权限获取失败时
						, (o, permissionNamesObj) -> {
							final List<String> permissionNames = (List<String>)permissionNamesObj;
							String message = ToolKits.i18n(SplashActivity.this, R.string.rb_permission_fail_to_exite, ToolKits.getAppName(SplashActivity.this), permissionNames);
							new AlertDialog.Builder(SplashActivity.this).setCancelable(false)
									.setTitle($$(R.string.common_permission_alert))
									.setMessage(message)
									// 直接退出，不让用户用此APP了（就像微信的逻辑一样！）
									.setPositiveButton($$(R.string.general_got_it), (dialog, which) -> finish())
									.show();
						}
						, false);
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}

			@Override
			public void onAnimationStart(Animation animation) {
			}
		});
	}

//	/**
//	 * 重写父类方法，取消深色状态栏文字的设置。
//	 */
//	@Override
//	protected void configStatusBarTextColorDark() {
//		// 什么也不需要做
//	}

	/**
	 * 闪屏结束后，跳转到...
	 */
	private void redirectTo() {
		SharedPreferences preferences = this.getSharedPreferences(SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);
		// 是否是app首次安装时
		boolean isFrist = (!preferences.contains("isFirstIn")) || (preferences.getBoolean("isFirstIn", true));

		// 是app安装后的首次打开
		if (isFrist) {
			// 跳转到帮助页
			startActivity(IntentFactory.createHelpActivityIntent(SplashActivity.this, HelpActivity.FININSH_VIEWPAGE_GO_TAB_HOST, false));
			finish();
		}
		// 不是首次打开（将进入自动登陆判断流程）
		else {
			// 尝试读取上传登陆成功后的账号信息（以备尝试进行自动登陆）
			LoginInfoToSave lastLoginInfo = PreferencesToolkits.getDefaultLoginName(this);
			if(lastLoginInfo != null) {
				String loginName = lastLoginInfo.getLoginName();
				String loginPsw = lastLoginInfo.getLoginPsw();

				// 账号信息不为空，且自动登际开关为true时，将尝试进行自动登陆（自动登陆成功后立即跳转主页，而不用到登陆页）
				if(loginName != null && loginPsw != null && lastLoginInfo.isAutoLogin()) {

					// 观察者：http认证失败后要做的事
					Observer afterLoginHttpServerFailObs = (o, arg) -> {
						// 进入登陆界面
						startActivity(IntentFactory.createLoginIntent(SplashActivity.this));
						finish();
					};

					// 观察者：连接IM服务器成功后要做的事(进入主界面等)
					Observer afterLoginIMServerSucessObs = (o, arg) -> LoginHelper.afterLoginIMServerSucess(SplashActivity.this);

					// 构建登陆信息
					LoginInfo2 loginInfo = LoginHelper.constructLoginInfo(this, loginName, loginPsw);
					// 提交用户http登陆信息认证和版本检查等（这就是im产品中的完整登陆流程）
					new LoginHelper.Login$CheckUpdateAsyc(this, loginInfo, afterLoginHttpServerFailObs, afterLoginIMServerSucessObs).execute();
					return;
				}
			}

			// 如果没有走上方的自动登陆流程，将会走到本行代码，即正常地进入登陆界面
			startActivity(IntentFactory.createLoginIntent(this));
			finish();
		}
	}
}